function objectFactory() { //new
    // 
    let obj = {}; // 和原型没有血缘关系 只是原型式面向对象
    // var Constructor = arguments[0];
    // var Constructor = arguments.shift(); 报错 因为arguments是一个伪数组
    var Constructor = [].shift.call(arguments);
    // 把[]的方法，放到arguments上使用,再用shift方法
    // obj1.(method).call(obj2,argument1,argument2)
    //如上，call的作用就是把obj1的方法放到obj2上使用，后面的argument1..这些做为参数传入。
    //obj.__proto__ = Constructor.prototype;
    var ret = Constructor.apply(obj, arguments);// 构造函数的返回值
    return typeof ret === 'object' ? ret || obj : obj;// 实例
    // return 排除 构造函数返回非object，和null的情况
}

function Person(name, age) {
    this.name = name;
    this.age = age;
    // return 1;
    // return null;
    return {
        name,
        age,
        live: 'live'
    }
}

let p = objectFactory(Person, 'Cavan', 21);

console.log(p.live);
